//#include <iostream>
//#include <vector>
//using namespace std;
//
//int main() {
//    int q;
//    cin >> q;
//    while (q--)
//    {
//        int x;
//        cin >> x;
//        if (x % 2 == 0) {
//            cout << x << endl;
//        }
//        else {
//            vector<int> v;
//            int y = x;
//            while (y)
//            {
//                v.push_back(y % 10);
//                y /= 10;
//            }
//            bool vis = false;
//            for (int i = 0; i < v.size(); i++)
//            {
//                if (v[i] % 2 == 0) {
//                    vis = true;
//                    swap(v[i], *(v.end() - 1));
//                    break;
//                }
//            }
//            if (!vis) {
//                cout << -1 << endl;
//            }
//            else {
//                for (int i = 0; i < v.size(); i++)
//                {
//                    cout << v[i];
//                }
//                cout << endl;
//            }
//        }
//    }
//    return 0;
//}

#include <iostream>
using namespace std;
const int N = 15;
int n;
int ret;
int a[N];
bool vis[N];
void dfs(int u)
{
    if (u == n + 1)
    {
        ret++;
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (vis[i]) continue;
        if (vis[a[i]]) return;
        vis[i] = true;
        dfs(u + 1);
        vis[i] = false;
    }
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    dfs(1);
    cout << ret;
    return 0;
}

///**
// * struct TreeNode {
// *	int val;
// *	struct TreeNode *left;
// *	struct TreeNode *right;
// *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
// * };
// */
//class Solution {
//public:
//    /**
//     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
//     *
//     *
//     * @param root TreeNode类
//     * @return int整型
//     */
//    int ret = -1010;
//    int maxPathSum(TreeNode* root) {
//        dfs(root);
//        return ret;
//    }
//    int dfs(TreeNode* root)
//    {
//        if (root == nullptr) return 0;
//        int l = max(0, dfs(root->left));
//        int r = max(0, dfs(root->right));
//        ret = max(ret, root->val + l + r);
//        return root->val + max(l, r);
//    }
//};